﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Ventas
{
    public partial class frmVentas : System.Web.UI.Page
    {
        private const string KEYVENTA = "venta";

        [Dependency]
        public IProductoBL productoService { get; set; }

        [Dependency]
        public IVentaBL ventaService { get; set; }
        [Dependency]
        public IClienteBL clienteService { get; set; }

        [Dependency]
        public ITipoDocumentoBL tipoDocumentoBl { get; set; }

        #region LoadPage
        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idPedido = Request.QueryString["id"];

           var bp = ventaService.GetNetxtNroBoleta();

            if (!Page.IsPostBack)
            {
                if (opc != null && opc == "nuevo")
                {
                    var nuevaVenta = new Venta()
                    {
                        Fecha = DateTime.Now
                       
                    };
                    //Correlativo
                    //nuevaVenta.Correlativo = bp;
                    BindingVenta(nuevaVenta);
                   
                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc =="editar" && idPedido != null)
                {
                    
                    var venta = ventaService
                        .GetFromVentasById(Int32.Parse(idPedido.ToString()));

                    //cbTipoDocumento.SelectedValue = venta.TipoDocumento.ToString();

                    //venta.Correlativo = txtCodigo.Text.ToString();
                    BindingVenta(venta);

                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc == "delete" && idPedido != null)
                {
                    var id = Int32.Parse(idPedido.ToString());

                    ventaService.RemoveVenta(id);
                    Response.Redirect("frmListVentas.aspx");
                }
            }
        }
        #endregion 

        public IQueryable<Producto> GetProductos([Control("txtCriterio")] string criterio)
        {
            return productoService.GetFromProductosByCriterio(criterio).AsQueryable();
        }


        #region Guardar
        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var venta = GetVenta();

            venta.Fecha = DateTime.Parse(txtFecha.Text);
            venta.IdTipoDocumento = Int32.Parse(cbTipoDocumento.SelectedValue.ToString());
            venta.estadoVenta = true;

            var porcentaje = tipoDocumentoBl.GetFromTipoDocumentoById(
                Convert.ToInt32(cbTipoDocumento.SelectedValue.ToString())).IGV.ToString();

            var igv = Convert.ToString(
                Convert.ToDecimal(venta.Total)*(Convert.ToDecimal(porcentaje)));

            var igbBD = Math.Round(Convert.ToDecimal(igv), 2);

            

            if (venta != null)
            {
                if (ViewState["opc"].ToString()== "nuevo")
                {
                    if (txtCliente.Text == "" && txtRuc.Text == "")
                    {
                        ScriptManager.
                                RegisterClientScriptBlock(this,
                                this.GetType(), "alertMessage", "alert('Falta ingresar datos de cliente')", true);
                    }else{
                        
                        
                       
                        venta.Igv = igbBD;
                        ventaService.AddVenta(venta);
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('VENTA Registrada..!!')", true);
                        Response.Redirect("frmListVentas.aspx");
                    }
                }
                else if (ViewState["opc"].ToString()== "editar")
                {
                    if (txtCliente.Text == "" && txtRuc.Text == "")
                    {
                        ScriptManager.
                            RegisterClientScriptBlock(this,
                                this.GetType(), "alertMessage", "alert('Llenar datos de Cliente..!!')", true);
                    }
                    else
                    {
                        venta.Igv = igbBD;
                        ventaService.UpdateVenta(venta);
                        ScriptManager.
                            RegisterClientScriptBlock(this,
                                this.GetType(), "alertMessage", "alert('Venta Editada..!!')", true);
                        Response.Redirect("frmListVentas.aspx");
                    }
                }
            }
            
        }
        #endregion

        #region Get Venta
        private Venta GetVenta()
        {
            return Cache.Get(KEYVENTA) as Venta;
        }
        #endregion

        #region BindingVenta
        private void BindingVenta(Venta venta)
        {
            
            
            txtCodigo.Text = venta.Id.ToString();
            txtFecha.Text = venta.Fecha.ToShortDateString();

            if (venta.Cliente != null)
            {
                txtRuc.Text = venta.Cliente.RucCliente;
                txtCliente.Text = venta.Cliente.NombreCliente;
                txtDireccion.Text = venta.Cliente.DireccionCliente;
            }

            venta.Total = venta.DetalleVenta.Sum(dp => dp.Monto);
            lvDetalleVenta.DataSource = venta.DetalleVenta;
            lvDetalleVenta.DataBind();
            
            var lblTotal = lvDetalleVenta.FindControl("lblTotal") as Label;
            

            if (lblTotal != null)
                lblTotal.Text = venta.Total.ToString();
            //actualizo el cache
            
            Cache.Insert(KEYVENTA, venta);
            
        }
        #endregion

        #region Buscar Cliente
        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            var rucDni = txtRuc.Text;

            var cliente = clienteService.GetFromClienteByDni(rucDni);

            var venta = Cache.Get(KEYVENTA) as Venta;

            if (cliente == null)
            {
                //lblMsgCliente.Text = "El cliente no existe !!!";
                txtRuc.Text = "";
                txtCliente.Text = "";
                txtDireccion.Text = "";
                venta.Cliente = null;
                ScriptManager.
                                RegisterClientScriptBlock(this,
                                this.GetType(), "alertMessage", "alert('El CLIENTE no existe!!')", true);

            }
            else
            {
                venta.ClienteId = cliente.Id;
                venta.Cliente = cliente;

                Cache.Insert(KEYVENTA, venta);

                txtRuc.Text = cliente.RucCliente;
                txtCliente.Text = cliente.NombreCliente;
                txtDireccion.Text = cliente.DireccionCliente;
                //lblMsgCliente.Text = "";
            } 
        }
        #endregion

        #region tipoDocumento
        public IEnumerable<TipoDocumento> GetTipoDocumentos()
        {
            return tipoDocumentoBl.GetAllFromTipoDocumentos();
        }
        #endregion

        #region ya no mas boton update
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
        }
        [WebMethod(Description = "CalcularTotal")]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        private void CalcularTotal()
        {
            var venta = GetVenta();


            foreach (var row in lvDetalleVenta.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                venta.DetalleVenta.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                venta.DetalleVenta.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
            }

            BindingVenta(venta);
        }

        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
        }
        #endregion
        protected void lvDetalleVenta_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                //recupera pedido del cache
                var venta = GetVenta();

                var detalle = venta.DetalleVenta.
                    Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    venta.DetalleVenta.Remove(detalle);

                BindingVenta(venta);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var venta = GetVenta();

                //var valorCantidad= lvDetalleVenta.FindControl("txtCantidad") as TextBox;
                //var valorPrecio = lvDetalleVenta.FindControl("txtPrecio") as TextBox;

                //if (decimal.Parse(valorPrecio.Text)>0 && venta.DetalleVenta.Count()>0)
                //{
                    foreach (var row in lvDetalleVenta.Items)
                    {
                        var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                        var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                        venta.DetalleVenta.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                        venta.DetalleVenta.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
                    }

                    BindingVenta(venta);
                //}
                //else if (decimal.Parse(valorCantidad.Text)<=0)
                //{
                    //ScriptManager.
                    //             RegisterClientScriptBlock(this,
                    //             this.GetType(), "alertMessage", "alert('La Cantidad tiene un valor incorrecto.!!')", true);
                //    Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('TwoDot File uploaded successfully');", true);
                //    Page.ClientScript.RegisterStartupScript(this.GetType(),
                //              "mensaje",
                //                 "<script type=\"text/javascript\">" +
                //                    "alert(\'La Cantidad tiene un valor incorrecto.!!\');" +                                    
                //                      "</script>", true);
                //}
                //else
                //{
                //    Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('TwoDot File uploaded successfully');", true);
                //    Page.ClientScript.RegisterStartupScript(this.GetType(),
                //              "mensaje",
                //                 "<script type=\"text/javascript\">" +
                //                    "alert(\'La Cantidad tiene un valor incorrecto.!!\');" +
                //                      "</script>", true);
                 
                //}
                

                
            }
        }

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());

                
                var venta = GetVenta();

                var detVe = venta.DetalleVenta;

                var existe = venta.DetalleVenta
                    .Where(dp => dp.IdProducto == productoId).SingleOrDefault();

                //var mismo = venta.DetalleVenta.Where(p =>(p.Producto.NombreProducto == p.Producto.NombreProducto) &&
                //    (p.Producto.Precio != productoPrecio.Precio)).SingleOrDefault();

                if (existe != null)
                {
                    
                        existe.Cantidad += 1; 
                    
                    
                }
                else
                {
                    var producto = productoService
                        .GetFromProductosById((productoId));

                    var newDetalle = new DetalleVenta()
                    {
                        IdVenta = venta.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        PrecioUnit = producto.Precio,
                        Cantidad = 1
                    };

                    venta.DetalleVenta.Add(newDetalle);
                }
                //venta.Total = venta.DetalleVenta.Sum(i => i.Monto);

                BindingVenta(venta);
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListVentas.aspx");
        }

        protected void odsCliente_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            e.ObjectInstance = clienteService;
        }

        protected void gridCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            var clienteRuc = gridCliente.SelectedValue.ToString();
            var venta = Cache.Get(KEYVENTA) as Venta;
            if (clienteRuc!=null)
            {
                var cliente = clienteService.GetFromClienteByDni(clienteRuc);

    
                venta.ClienteId = cliente.Id;
                venta.Cliente = cliente;

                Cache.Insert(KEYVENTA, venta);

                txtRuc.Text = cliente.RucCliente;
                txtCliente.Text = cliente.NombreCliente;
                txtDireccion.Text = cliente.DireccionCliente;

            }
            else
            {
                ScriptManager.
                RegisterClientScriptBlock(this,
                this.GetType(), "alertMessage",
                "alert('Debe seleccionar un Cliente..!!')", true);
            }

            
        }
    }
}